<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>Brython</title>
<link rel="stylesheet" href="../doc_brython.css">
</head>
<body>
<a name="modele"><h3>Compilación y ejecución</h3>
</ol>
El archivo <b>brython.js</b> es generado por la compilación de varios scripts :
<ul>
<li><b>py_tokenizer.js</b> : corta el código fuente de Python en componentes léxico (tokens): identificadores, literales, operadores delimitadores, etc
<li><b>py2js.js</b> : convierte los tokens al código Javascript
<li><b>py_tokens.js</b> : clases para manipular los componentes léxico (tokens)
<li><b>py_utils.js</b> : funciones de utilidad (conversión de tipos entre Python y Javascript)
<li><b>py_string.js</b> : implementa la clase Python str desde el objeto Javascript String
<li><b>py_list.js</b> : implementa la clase Python list desde el objeto Javascript Array
<li><b>py_classes.js</b> : incluye todos los demás tipos y funciones integradas
<li><b>py_import.js</b> : implementa la palabra clave <tt>import</tt>
<li><b>py_dom.js</b> : interacción con el documento HTML (DOM)
<li><b>py_ajax.js</b> : implementa Ajax
<li><b>py_local_storage.js</b> : implementa local storage de HTML5
<li><b>py_svg.py</b> : soporte para SVG (gráficos vectoriales)
</ul>

La "compilación" y ejecución de un script de Brython pasa por las siguientes fases :
<ol>
<li>si el nivel de debug es mayor que 0, se añade una línea que contiene el número de la línea siguiente que se ejecutara, después de cada línea de código fuente Python, excepto cuando esto causaría un error de sintaxis (antes un <tt>except</tt> o un <tt>else</tt>)
<p>
<li>corta el código fuente de Python en componentes léxico
<br>Se hace por medio del script <tt>py_tokenizer.js</tt>. Tokens son listas Javascript con 3 elementos [<em>tipo, valor, posicion</em>]. <em>posicion</em> es la clasificación del primer carácter del token en el código Python. Los dos otros elementos pueden tener los valors siguientes :
<ul>
<li><tt>["indent",<em>indentation</em>]</tt> : siempre presente en el comienzo de cada línea, <em>indentation</em> es un numero
<li><tt>["newline","\n"]</tt> : cambio de linea
<li><tt>["str",<em>string</em>]</tt> : literal de tipo cadena
<li><tt>["int",<em>number</em>]</tt> : literal de tipo entero
<li><tt>["float",<em>number</em>]</tt> : literal de tipo real
<li><tt>["id",<em>string</em>]</tt> : identificador de variable (cadena)
<li><tt>["qualifier",<em>string</em>]</tt> : nombre después de un punto, como en <tt>bar</tt> in <tt>foo.bar</tt> (foo dot bar)
<li><tt>["keyword",<em>value</em>]</tt> : palabra clave Python (cadena)
<li><tt>["bracket",<em>value</em>]</tt> : paréntesis, soporte o abrazadera. El valor puede ser <em>()[]{}</em>
<li><tt>["point","."]</tt> : un punto
<li><tt>["delimiter",<em>string</em>]</tt> : un valor de delimitador de <em>:</em>, <em>,</em> o <em>=</em> dentro de  parentesis (sintaxis <tt>foo(x = 0)</tt>)
<li><tt>["assign","="]</tt> : el símbolo = cuando no esta dentro de un paréntesis, y operadores de asignación aumentada: +=, *= etc.
<li><tt>["operator",<em>string</em>]</tt> : un operador
</ul>
<p>En este paso, errores pueden ser reportados : 
<ul>
<li>error de sangría
<li>cadena inconclusa
<li>paréntesis no balanceados
<li>carácter ilegal
<li>palabra clave Python no soportada por Brython
<li>identificado inutilizable porque entra en conflicto con las palabras reservadas de JavaScript (eg <em>window, document, status...</em>)
</ul>
<p>
<li>Traducción de componentes léxico en código Javascript
<p>Se hace por medio de los scripts <tt>py2js.js, py_tokens.js</tt> y <tt>py_utils.js</tt>, en e siguiente orden:
<ol>
<li>sustitución de la secuencia <tt>not in</tt> por el operado <tt>__not_in__</tt>
<li>transformación de paréntesis, corchetes y llaves en tuplas, listas y diccionarios
<li>conversión de argumentos en la definición de la función (<tt>def foo(x, y = 1, *args, **kw)</tt>)
<li>conversión de argumentos como palabras clave en las llamadas de funciones (<tt>foo(b = 1)</tt>)
<li>resolución de combinación de + y - (++ pasa a ser +, -+- vuelve en -, etc.) y de los operadores simples - y +
<li>sustitución de <tt>import foo</tt> con <tt>Import(foo)</tt>
<li>traducción de <tt>try / except / finally / else</tt> blocks
<li>traducción de <tt>assert</tt>
<li>traducción de sangría en llaves para los bloques de <tt>if, else, elif, def, for, try, finally</tt>
<li>reemplazo de <tt>not x</tt> con <tt>$not(x)</tt>
<li>sustitución de las formas abreviadas (<tt>x += 1</tt>) por asignaciones y operaciones simples (<tt>x = x+1</tt>)
<li>reemplazo de los operadores por sus funciones equivalentes : <tt>x+y</tt> se convierte en <tt>x.__add__(y)</tt>
<li>condiciones con <tt>and</tt> y <tt>or</tt>
<li>asignaciones en cadena (<tt>x = y = 0</tt>), directa (<tt>x = y</tt>) y multiple (<tt>x, y = a, b</tt>)
<li>acceso (<tt>a=foo[x]</tt>) o asignación (<tt>foo[x] = 0</tt>) a las claves y rebanadas (slices)
<li>acceso (<tt>a=foo.x</tt>) y asignación (<tt>foo.x = 0</tt>) a los atributos
</ol>
<p>
<li>La ejecución de código Javascript generado
<p>Las clases definidas en otros módulos se utilizan para la sintaxis de Python y la interfaz con el navegador
<p>Durante el ejecución del script generado, se puede llamar :
<ul>
<li>a las clases integradas definidas adentro de <tt>py_classes.js, py_string.js, py_list.js, py_dom.js, py_ajax.js, py_local_storage.js, py_svg.js</tt>
<li>a las funciones internas, que no se ven en Python (su nombre siempre comienzan con $) que se encuentra en <tt>$py_utils.js</tt>. Las mas importantes son :
<ul>
<li><tt>$JS2py</tt> : acepta un solo argumento y devuelve :
<ul>
<li>el argumento sin cambio si es de un tipo reconocido por Brython (es decir, con atributo <tt>__class__</tt>)
<li>una instancia de DOMObject (o DOMEvent) si el argumento es un objeto (o un evento) DOM
<li>una instancia de JSObject "envolvente" el argumento si no
</ul>
<li><tt>$MakeArgs</tt> llamada al principio de la ejecución de cada función cuya firma incluye al menos un argumento. Se construye un espacio de nombres de los argumentos pasados ​​a la función, por medio de la funcion $JS2py llamada sobre todos los argumentos
<li><tt>$list_comp</tt> llamada por cada comprensión de lista
<li><tt>$raise</tt> está llamada a producir excepciones
<li><tt>$test_expr</tt> y <tt>$test_item</tt> se utilizan en la evaluación de las condiciones combinadas por <code>and</code> o <code>or</code>
</ul>
<li>a las funciones definidas en el script <tt>py_import.js</tt> por la gestión de las importaciones (import)
</ul>
<p>Si hay un error de tiempo de ejecución, una traza se imprime en la consola de navegador. Está estrechamente modelada de la que sería generado por Python

</ol>
</body>
</html>
